# !/usr/bin/env python
# -*- coding: utf-8 -*-
# ------------------------------
'''
1. 两数之和
给定一个整数数组 nums 和一个整数目标值 target，请你在该数组中找出 和为目标值 target  的那 两个 整数，并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是，数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

'''

class Solution(object):
    def __init__(self):
        self.nums = [3, 3]
        self.target = 6

    # 方法一
    def twoSum1(self, nums, target):
        """
        通过，O(N^2)
        """
        for i in range(len(nums)):
            for j in range(len(nums)):
                if nums[i] + nums[j] == target and i != j:
                    return i, j


    # 方法2
    def twoSum2(self, nums, target):
        '''
        通过，O（N）
        '''
        # 遍历列表里的每个数
        for i in nums:
            # 查看nums是否存在 target-i的数
            if (target - i) in nums:
                # 如果有且不止一个的话，我们只许，将i的下标，以及i后面的那个等于i的下标返回
                # 这里要记得从i的下一个下标开始找（index（i，index(i) + 1））
                if nums.count(target - i) != 1:
                    return [nums.index(i), nums.index(target - i, nums.index(i) + 1)]
                # 如果只出现一次target - i
                else:
                    # 这里要判断是否i本身（target=6，i=3）3确实也出现了一次那两个返回下标就一样了
                    # 所以要避免这种情况就要判断只出现过一次的这个数i和target-i的下标是否相等
                    # 相等就跳过
                    if nums.index(i) == nums.index(target - i):
                        continue
                    else:
                        return [nums.index(i), nums.index(target - i)]

    # 方法三
    def twoSum3(self, nums, target):
        ''''''
        # nums_dict = {}
        # # enumerate(迭代对象，迭代开始下标),返回下标和数的键值对
        # for ind, num in enumerate(nums):
        #     nums_dict[ind] = num
        # print(nums_dict)
        # for keys, values in enumerate(nums):
        #     if not target - nums_dict.get(keys) is None and

        hashmap = {}
        # 这里用列表数值做键，一是对待有重复的数值，写入字典终止后也会去重，留下最后一组重复数值
        # 为了[3, 3]
        for ind, num in enumerate(nums):
            hashmap[num] = ind
        for i, num in enumerate(nums):
            j = hashmap.get(target - num)
            if j is not None and i != j:
                return [i, j]
    # 方法四
    def twoSum3(self, nums, target):
        hashmap = {}
        for i, num in enumerate(nums):
            if hashmap.get(target - num) is not None:
                return [i, hashmap.get(target - num)]
            hashmap[num] = i  # 这句不能放在if语句之前，解决list中有重复值或target-num=num的情况
if __name__ == '__main__':

    solution = Solution()
    print([solution.twoSum1(solution.nums, solution.target)])
    print([solution.twoSum2(solution.nums, solution.target)])
    print([solution.twoSum3(solution.nums, solution.target)])